System.register([], function () {
	'use strict';
	return {
		execute: function () {

			// parameters are associated correctly
			const retained1 = function ( func, obj ) { return func( obj ); };
			retained1( obj => obj(), () => () => console.log( 'effect' ) )();

			const retained2 = function ( func, obj ) { return func( obj ); };
			retained2( obj => ({ foo: obj }), {} ).foo.bar.baz = 1;

			// parameters and arguments have the same values
			function retained3 ( x ) {
				x.foo.bar = 1;
			}

			retained3( {} );

			function retained4 ( x ) {
				arguments[ 0 ].foo.bar = 1;
			}

			retained4( {} );

			// assigning to an argument will change the corresponding parameter
			function retained5 ( x ) {
				arguments[ 0 ] = {};
				x.foo.bar = 1;
			}

			retained5( { foo: {} } );

			// assigning to a parameter will change the corresponding argument
			function retained6 ( x ) {
				x = {};
				arguments[ 0 ].foo.bar = 1;
			}

			retained6( { foo: {} } );

			// the number of arguments does not depend on the number of parameters
			function retained7 ( x ) {
				arguments[ 1 ].foo.bar = 1;
			}

			retained7( {}, {} );

		}
	};
});
